﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using Entidades;
using System.Data;
using System.Data.Common;

namespace DAO
{
    public class PerfilDAO : DAOBase
    {
		private const string InsertProcedure = "PR_PERFIL_I"; 
		private const string UpdateProcedure = "PR_PERFIL_U"; 
		private const string SelectProcedure = "PR_PERFIL_S"; 
		private const string SelectAllProcedure = "PR_PERFIL_SA"; 
		private const string DeleteProcedure = "PR_PERFIL_D";
        private const string ByProjectProcedure = "PR_PERFIL_SPROY";

		public PerfilDAO() : base() {}

        #region VirtualProcedures

        public override string obtainInsertProcedure()
        {
            return InsertProcedure;
        }

        public override string obtainDeleteProcedure()
        {
            return DeleteProcedure;
        }

        public override string obtainUpdateProcedure()
        {
            return UpdateProcedure;
        }

        public override string obtainSelectProcedure()
        {
            return SelectProcedure;
        }

        public override string obtainSelectAllProcedure()
        {
            return SelectAllProcedure;
        }

        public string obtainByProjectProcedure()
        {
            return ByProjectProcedure;
        }

        #endregion

        #region IDAO Members

        public override void cargarEntidad(EntidadBase entidad, IDataReader reader)
        {
            EntidadPerfil perfil = (EntidadPerfil)entidad;
            object tempValue;
            // Campo Id
            perfil.Id = Convert.ToInt32(reader["id_perfil"]);
            // Resto de campos
            tempValue = reader["nombre"];
            if (tempValue.Equals(DBNull.Value))
            {
                perfil.Nombre = "";
            }
            else
            {
                perfil.Nombre = Convert.ToString(tempValue);
            }

            tempValue = reader["descripcion"];
            if (tempValue.Equals(DBNull.Value))
            {
                perfil.Descripcion = "";
            }
            else
            {
                perfil.Descripcion = Convert.ToString(tempValue);
            }

            tempValue = reader["tecnologia"];
            if (tempValue.Equals(DBNull.Value))
            {
                perfil.Tecnologia = "";
            }
            else
            {
                perfil.Tecnologia = Convert.ToString(tempValue);
            }

            tempValue = reader["conocimientos"];
            if (tempValue.Equals(DBNull.Value))
            {
                perfil.Conocimientos = "";
            }
            else
            {
                perfil.Conocimientos = Convert.ToString(tempValue);
            }

            tempValue = reader["cantidad"];
            if (tempValue.Equals(DBNull.Value))
            {
                perfil.Cantidad = 0;
            }
            else
            {
                perfil.Cantidad = Convert.ToInt32(tempValue);
            }

            tempValue = reader["fk_id_proyecto"];
            EntidadProyecto proyecto = new EntidadProyecto();
            if (tempValue.Equals(DBNull.Value))
            {
                proyecto.Id = 0;
            }
            else
            {
                proyecto.Id = Convert.ToInt32(tempValue);
            }
            perfil.Proyecto = proyecto;
            
        }

        public override List<EntidadBase> cargar(IDataReader reader)
        {
            // Creo la lista vacia
            List<EntidadBase> listaEntidades = new List<EntidadBase>();
            // Itero en el data reader y cargo los datos basicos
            while (reader.Read())
            {
                EntidadPerfil entity = new EntidadPerfil();
                cargarEntidad(entity, reader);
                listaEntidades.Add(entity);
            }

            reader.Close();

            return listaEntidades;
        }

        public List<EntidadBase> searchByProject(EntidadBase entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentException();
            }

            bool opened = false;

            try
            {
                if (this.dalObject.IsConnectionClosed)
                {
                    opened = true;
                    this.dalObject.Open();
                }

                // Creo el comando
                IDbCommand cmd = null;
                EntidadProyecto proyecto = (EntidadProyecto)entidad;
                cmd = dalObject.BuildCommand(this.obtainByProjectProcedure(),
                    new object[] { proyecto.Id });

                // Ejecuto el comando de insercion
                IDataReader reader = cmd.ExecuteReader();
                List<EntidadBase> listaEntidades = cargar(reader);
                if (listaEntidades.Count > 0)
                {
                    return listaEntidades;
                }
            }
            catch (DbException dbError)
            {
                throw new DALException("Error de base de datos al intentar guardar entidad.", dbError);
            }
            catch (Exception error)
            {
                throw new DALException("Error inesperado al intentar guardar entidad.", error);
            }
            finally
            {
                if (opened)
                {
                    this.dalObject.Close();
                }
            }

            return null;
        }

        #endregion
    }
}
